package RiskAlert;

import java.util.Arrays;


/**
 * 求逆矩阵
 */

public class InverseMatrix{

	private static double[][] matrix;//原始矩阵的增广矩阵，右侧加一单位矩阵
	private static double[][] inversematrix;//逆矩阵
	private static int row;//矩阵行
	private static int column;//矩阵列

	/**
	 * 初始化增广矩阵
	 * @param originmatrix
	 */
	public static void InitMatrix(double[][] originmatrix){

		row=originmatrix.length;
		column=originmatrix.length*2;

		matrix=new double[row][column];
		inversematrix=new double[row][row];

		//把原始矩阵赋予增广矩阵左侧
		for(int i=0;i<row;i++){
			for(int j=0;j<row;j++)
				matrix[i][j]=originmatrix[i][j];
		}

		//		for(int i=0;i<row;i++){
		//			for(int j=0;j<column;j++)
		//				System.out.print(this.matrix[i][j]+" ");
		//			System.out.println();
		//		}


		//		System.out.println("增广矩阵为：");
		//		for(int i=0;i<row;i++)
		//		{
		//			for(int j=0;j<row;j++)
		//			{
		//				System.out.print(originmatrix[i][j]+"  ");
		//			}
		//			System.out.println();
		//		}
		//对增广矩阵右侧的单位矩阵赋初始值
		for(int i=0;i<row;i++)
		{
			for(int j=row;j<row*2;j++)
			{
				if((j-i)==row)
				{
					matrix[i][j]=1.0;
				}
				else
				{
					matrix[i][j]=0;
				}
			}
		}
	}

	/**
	 * 计算逆矩阵
	 * @param matrix
	 * @return
	 */
	public static void generateIM(){

		for(int i=0;i<row;i++)
		{
			if(matrix[i][i]!=1)
			{
				double bs = matrix[i][i];
				matrix[i][i]=1;
				for(int p=i;p<row*2;p++)
				{
					matrix[i][p]/=bs;
				}

			}

			for(int j=0;j<row;j++)
			{
				if(j!=i)
				{
					double bs = matrix[j][i];
					for(int m=0;m<row*2;m++)
					{
						matrix[j][m]-=bs*matrix[i][m];
					}
				}
				else
				{
					continue;
				}
			}
		}
		//		//给逆矩阵赋值
		for(int average=Math.round(column/2),i=0;i<row;i++)
		{
			inversematrix[i]=Arrays.copyOfRange(matrix[i], average, column);
		}
		//输出逆矩阵
		//		for(int i=0;i<row;i++){
		//			for(int j=0;j<row;j++)
		//				System.out.print(inversematrix[i][j]+" ");
		//			System.out.println();
		//		}
	}

	public static double[][] getIM(double[][] originmatrix){
		InitMatrix(originmatrix);
		generateIM();
		return inversematrix;
	}

	//	public static void main(String args[])
	//	{
	//
	//		double[][] a=new double[3][3];
	//		a[0][0] = 1;
	//		a[0][1] = 2;
	//		a[0][2] = 3;
	//		a[1][0] = 2;
	//		a[1][1] = 2;
	//		a[1][2] = 1;
	//		a[2][0] = 3;
	//		a[2][1] = 4;
	//		a[2][2] = 3;
	//
	//		double[][] test=getIM(a);
	//		System.out.println("-------------------------------------------");
	//		for(int i=0;i<test.length;i++){
	//			for(int j=0;j<test.length;j++)
	//				System.out.print(test[i][j]+" ");
	//			System.out.println();
	//		}
	//
	//	} 

}